<?php
// PHP Layers Menu 3.1.1 (C) 2001-2003 Marco Pratesi (marco at telug dot it)

/**
* This file contains the code of the PHPTreeMenu class.
* @package PHPLayersMenu
*/

/**
* This is the PHPTreeMenu class of the PHP Layers Menu library.
*
* This class depends on the LayersMenuCommon class.  It provides "server-side" (PHP-based) tree menus, that to do not require JavaScript to work.
*
* @version 3.1.1
* @package PHPLayersMenu
*/
class PHPTreeMenu extends LayersMenuCommon {

/**
* The character used for the PHP Tree Menu in the query string to separate items ids
* @access private
* @var string
*/
var $phpTreeMenuSeparator;
/**
* The default value of the expansion string for the PHP Tree Menu
* @access private
* @var string
*/
var $phpTreeMenuDefaultExpansion;
/**
* Type of images used for the Tree Menu
* @access private
* @var string
*/
var $phpTreeMenuImagesType;
/**
* An array where we store the PHP Tree Menu code for each menu
* @access private
* @var array
*/
var $_phpTreeMenu;

/**
* The constructor method; it initializates some variables
* @return void
*/
function PHPTreeMenu() {
	$this->LayersMenuCommon();

	$this->phpTreeMenuSeparator = "|";
	$this->phpTreeMenuDefaultExpansion = "";
	$this->phpTreeMenuImagesType = "png";
	$this->_phpTreeMenu = array();
}

/**
* The method to set the dirroot directory
* @access public
* @return boolean
*/
function setDirroot($dirroot) {
	return $this->setDirrootCommon($dirroot);
}

/**
* The method to set the value of separator for the Tree Menu query string
* @access public
* @return void
*/
function setPHPTreeMenuSeparator($phpTreeMenuSeparator) {
	$this->phpTreeMenuSeparator = $phpTreeMenuSeparator;
}

/**
* The method to set the default value of the expansion string for the PHP Tree Menu
* @access public
* @return void
*/
function setPHPTreeMenuDefaultExpansion($phpTreeMenuDefaultExpansion) {
	$this->phpTreeMenuDefaultExpansion = $phpTreeMenuDefaultExpansion;
}

/**
* The method to set the type of images used for the Tree Menu
* @access public
* @return void
*/
function setPHPTreeMenuImagesType($phpTreeMenuImagesType) {
	$this->phpTreeMenuImagesType = $phpTreeMenuImagesType;
}

/**
* Method to prepare a new PHP Tree Menu.
*
* This method processes items of a menu and parameters submitted
* through GET (i.e. nodes to be expanded) to prepare and return
* the corresponding Tree Menu code.
*
* @access public
* @param string $menu_name the name of the menu whose items have to be processed
* @return string
*/
function newPHPTreeMenu(
	$menu_name = ""	// non consistent default...
	) {
	$protocol = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") ? "https://" : "http://";
	$this_host = (isset($_SERVER["HTTP_HOST"])) ? $_SERVER["HTTP_HOST"] : $_SERVER["SERVER_NAME"];
	if (isset($_SERVER["SCRIPT_NAME"])) {
		$me = $_SERVER["SCRIPT_NAME"];
	} else if (isset($_SERVER["REQUEST_URI"])) {
		$me = $_SERVER["REQUEST_URI"];
	} else if (isset($_SERVER["PHP_SELF"])) {
		$me = $_SERVER["PHP_SELF"];
	} else if (isset($_SERVER["PATH_INFO"])) {
		$me = $_SERVER["PATH_INFO"];
	}
	$url = $protocol . $this_host . $me;
	$query = "";
	reset($_GET);
	while (list($key, $value) = each($_GET)) {
		if ($key != "p" && $value != "") {
			$query .= "&amp;" . $key . "=" . $value;
		}
	}
	if ($query != "") {
		$query = "?" . substr($query, 5) . "&amp;p=";
	} else {
		$query = "?p=";
	}
	$p = (isset($_GET["p"])) ? $_GET["p"] : $this->phpTreeMenuDefaultExpansion;

/* ********************************************************* */
/* Based on TreeMenu 1.1 by Bjorge Dijkstra (bjorge@gmx.net) */
/* ********************************************************* */
	$this->_phpTreeMenu[$menu_name] = "";

	$img_space		= $this->imgwww . "tree_space." . $this->phpTreeMenuImagesType;
	$alt_space		= "  ";
	$img_vertline		= $this->imgwww . "tree_vertline." . $this->phpTreeMenuImagesType;
	$alt_vertline		= "| ";
	$img_expand		= $this->imgwww . "tree_expand." . $this->phpTreeMenuImagesType;
	$alt_expand		= "+-";
	$img_expand_first	= $this->imgwww . "tree_expand_first." . $this->phpTreeMenuImagesType;
	$alt_expand_first	= "+-";
	$img_expand_corner	= $this->imgwww . "tree_expand_corner." . $this->phpTreeMenuImagesType;
	$alt_expand_corner	= "+-";
	$img_collapse		= $this->imgwww . "tree_collapse." . $this->phpTreeMenuImagesType;
	$alt_collapse		= "--";
	$img_collapse_first	= $this->imgwww . "tree_collapse_first." . $this->phpTreeMenuImagesType;
	$alt_collapse_first	= "--";
	$img_collapse_corner	= $this->imgwww . "tree_collapse_corner." . $this->phpTreeMenuImagesType;
	$alt_collapse_corner	= "--";
	$img_split		= $this->imgwww . "tree_split." . $this->phpTreeMenuImagesType;
	$alt_split		= "|-";
	$img_split_first	= $this->imgwww . "tree_split_first." . $this->phpTreeMenuImagesType;
	$alt_split_first	= "|-";
	$img_corner		= $this->imgwww . "tree_corner." . $this->phpTreeMenuImagesType;
	$alt_corner		= "`-";
	$img_folder_closed	= $this->imgwww . "tree_folder_closed." . $this->phpTreeMenuImagesType;
	$alt_folder_closed	= "->";
	$img_folder_open	= $this->imgwww . "tree_folder_open." . $this->phpTreeMenuImagesType;
	$alt_folder_open	= "->";
	$img_leaf		= $this->imgwww . "tree_leaf." . $this->phpTreeMenuImagesType;
	$alt_leaf		= "->";

	for ($i=$this->_firstItem[$menu_name]; $i<=$this->_lastItem[$menu_name]; $i++) {
		$expand[$i] = 0;
		$visible[$i] = 0;
		$this->tree[$i]["last_item"] = 0;
	}
	for ($i=0; $i<=$this->_maxLevel[$menu_name]; $i++) {
		$levels[$i] = 0;
	}

	// Get numbers of nodes to be expanded
	if ($p != "") {
		$explevels = explode($this->phpTreeMenuSeparator, $p);
		$explevels_count = count($explevels);
		for ($i=0; $i<$explevels_count; $i++) {
			$expand[$explevels[$i]] = 1;
		}
	}

	// Find last nodes of subtrees
	$last_level = $this->_maxLevel[$menu_name];
	for ($i=$this->_lastItem[$menu_name]; $i>=$this->_firstItem[$menu_name]; $i--) {
		if ($this->tree[$i]["level"] < $last_level) {
			for ($j=$this->tree[$i]["level"]+1; $j<=$this->_maxLevel[$menu_name]; $j++) {
				$levels[$j] = 0;
			}
		}
		if ($levels[$this->tree[$i]["level"]] == 0) {
			$levels[$this->tree[$i]["level"]] = 1;
			$this->tree[$i]["last_item"] = 1;
		} else {
			$this->tree[$i]["last_item"] = 0;
		}
		$last_level = $this->tree[$i]["level"];
	}

	// Determine visible nodes
	// all root nodes are always visible
	for ($i=$this->_firstItem[$menu_name]; $i<=$this->_lastItem[$menu_name]; $i++) {
		if ($this->tree[$i]["level"] == 1) {
			$visible[$i] = 1;
		}
	}
	if (isset($explevels)) {
		for ($i=0; $i<$explevels_count; $i++) {
			$n = $explevels[$i];
			if ($n >= $this->_firstItem[$menu_name] && $n <= $this->_lastItem[$menu_name] && $visible[$n] == 1 && $expand[$n] == 1) {
				$j = $n + 1;
				while ($j<=$this->_lastItem[$menu_name] && $this->tree[$j]["level"]>$this->tree[$n]["level"]) {
					if ($this->tree[$j]["level"] == $this->tree[$n]["level"]+1) {
						$visible[$j] = 1;
					}
					$j++;
				}
			}
		}
	}

	// Output nicely formatted tree
	for ($i=0; $i<$this->_maxLevel[$menu_name]; $i++) {
		$levels[$i] = 1;
	}
	$max_visible_level = 0;
	for ($cnt=$this->_firstItem[$menu_name]; $cnt<=$this->_lastItem[$menu_name]; $cnt++) {
		if ($visible[$cnt]) {
			$max_visible_level = max($max_visible_level, $this->tree[$cnt]["level"]);
		}
	}
	for ($cnt=$this->_firstItem[$menu_name]; $cnt<=$this->_lastItem[$menu_name]; $cnt++) {
		if ($visible[$cnt]) {
			$this->_phpTreeMenu[$menu_name] .= "<div class=\"treemenudiv\">\n"; 

			// vertical lines from higher levels
			for ($i=0; $i<$this->tree[$cnt]["level"]-1; $i++) {
				if ($levels[$i] == 1) {
					$img = $img_vertline;
					$alt = $alt_vertline;
				} else {
					$img = $img_space;
					$alt = $alt_space;
				}
				$this->_phpTreeMenu[$menu_name] .= "<img align=\"top\" border=\"0\" class=\"imgs\" src=\"" . $img . "\" alt=\"" . $alt . "\" />";
			}

			$not_a_leaf = $cnt<$this->_lastItem[$menu_name] && $this->tree[$cnt+1]["level"]>$this->tree[$cnt]["level"];

			if ($not_a_leaf) {
				// Create expand/collapse parameters
				$params = "";
				for ($i=$this->_firstItem[$menu_name]; $i<=$this->_lastItem[$menu_name]; $i++) {
					if ($expand[$i] == 1 && $cnt!= $i || ($expand[$i] == 0 && $cnt == $i)) {
						$params .= $this->phpTreeMenuSeparator . $i;
					}
				}
				if ($params != "") {
					$params = substr($params, 1);
				}
			}

			if ($this->tree[$cnt]["last_item"] == 1) {
			// corner at end of subtree or t-split
				if ($not_a_leaf) {
					if ($expand[$cnt] == 0) {
						$img = $img_expand_corner;
						$alt = $alt_expand_corner;
					} else {
						$img = $img_collapse_corner;
						$alt = $alt_collapse_corner;
					}
					$this->_phpTreeMenu[$menu_name] .= "<a name=\"" . $cnt . "\" class=\"phplm\" href=\"" . $url . $query . $params . "#" . $cnt . "\"><img align=\"top\" border=\"0\" class=\"imgs\" src=\"" . $img . "\" alt=\"" . $alt . "\" /></a>";
				} else {
					$this->_phpTreeMenu[$menu_name] .= "<img align=\"top\" border=\"0\" class=\"imgs\" src=\"" . $img_corner . "\" alt=\"" . $alt_corner . "\" />";
				}
				$levels[$this->tree[$cnt]["level"]-1] = 0;
			} else {
				if ($not_a_leaf) {
					if ($expand[$cnt] == 0) {
						if ($cnt == $this->_firstItem[$menu_name]) {
							$img = $img_expand_first;
							$alt = $alt_expand_first;
						} else {
							$img = $img_expand;
							$alt = $alt_expand;
						}
					} else {
						if ($cnt == $this->_firstItem[$menu_name]) {
							$img = $img_collapse_first;
							$alt = $alt_collapse_first;
						} else {
							$img = $img_collapse;
							$alt = $alt_collapse;
						}
					}
					$this->_phpTreeMenu[$menu_name] .= "<a name=\"" . $cnt . "\" class=\"phplm\" href=\"" . $url . $query . $params . "#" . $cnt . "\"><img align=\"top\" border=\"0\" class=\"imgs\" src=\"" . $img . "\" alt=\"" . $alt . "\" /></a>";
				} else {
					if ($cnt == $this->_firstItem[$menu_name]) {
						$img = $img_split_first;
						$alt = $alt_split_first;
					} else {
						$img = $img_split;
						$alt = $alt_split;
					}
					$this->_phpTreeMenu[$menu_name] .= "<img align=\"top\" border=\"0\" class=\"imgs\" src=\"" . $img . "\" alt=\"" . $alt . "\" />";
				}
				$levels[$this->tree[$cnt]["level"]-1] = 1;
			}

			if ($this->tree[$cnt]["parsed_href"] == "" || $this->tree[$cnt]["parsed_href"] == "#") {
				$a_href_open_img = "";
				$a_href_close_img = "";
				$a_href_open = "<a class=\"phplmnormal\">";
				$a_href_close = "</a>";
			} else {
				$a_href_open_img = "<a href=\"" . $this->tree[$cnt]["parsed_href"] . "\"" . $this->tree[$cnt]["parsed_title"] . $this->tree[$cnt]["parsed_target"] . ">";
				$a_href_close_img = "</a>";
				$a_href_open = "<a href=\"" . $this->tree[$cnt]["parsed_href"] . "\"" . $this->tree[$cnt]["parsed_title"] . $this->tree[$cnt]["parsed_target"] . " class=\"phplm\">";
				$a_href_close = "</a>";
			}

			if ($not_a_leaf) {
				if ($expand[$cnt] == 1) {
					$img = $img_folder_open;
					$alt = $alt_folder_open;
				} else {
					$img = $img_folder_closed;
					$alt = $alt_folder_closed;
				}
				$this->_phpTreeMenu[$menu_name] .= $a_href_open_img . "<img align=\"top\" border=\"0\" class=\"imgs\" src=\"" . $img . "\" alt=\"" . $alt . "\" />" . $a_href_close_img;
			} else {
				if ($this->tree[$cnt]["parsed_icon"] != "") {
					$this->_phpTreeMenu[$menu_name] .= $a_href_open_img . "<img align=\"top\" border=\"0\" src=\"" . $this->imgwww . $this->tree[$cnt]["parsed_icon"] . "\" width=\"" . $this->tree[$cnt]["iconwidth"] . "\" height=\"" . $this->tree[$cnt]["iconheight"] . "\" alt=\"" . $alt_leaf . "\" />" . $a_href_close_img;
				} else {
					$this->_phpTreeMenu[$menu_name] .= $a_href_open_img . "<img align=\"top\" border=\"0\" class=\"imgs\" src=\"" . $img_leaf . "\" alt=\"" . $alt_leaf . "\" />" . $a_href_close_img;
				}
			}

			// output item text
			$foobar = $max_visible_level - $this->tree[$cnt]["level"] + 1;
			if ($foobar > 1) {
				$colspan = " colspan=\"" . $foobar . "\"";
			} else {
				$colspan = "";
			}
			$this->_phpTreeMenu[$menu_name] .= "&nbsp;" . $a_href_open . $this->tree[$cnt]["parsed_text"] . $a_href_close . "\n";
			$this->_phpTreeMenu[$menu_name] .= "</div>\n";
		}
	}
/* ********************************************************* */

/*
	$this->_phpTreeMenu[$menu_name] =
	"<div class=\"phplmnormal\">\n" .
	$this->_phpTreeMenu[$menu_name] .
	"</div>\n";
*/
	// Some (old) browsers do not support the "white-space: nowrap;" CSS property...
	$this->_phpTreeMenu[$menu_name] =
	"<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n" .
	"<tr>\n" .
	"<td class=\"phplmnormal\" nowrap=\"nowrap\">\n" .
	$this->_phpTreeMenu[$menu_name] .
	"</td>\n" .
	"</tr>\n" .
	"</table>\n";

	return $this->_phpTreeMenu[$menu_name];
}

/**
* Method that returns the code of the requested PHP Tree Menu
* @access public
* @param string $menu_name the name of the menu whose PHP Tree Menu code
*   has to be returned
* @return string
*/
function getPHPTreeMenu($menu_name) {
	return $this->_phpTreeMenu[$menu_name];
}

/**
* Method that prints the code of the requested PHP Tree Menu
* @access public
* @param string $menu_name the name of the menu whose PHP Tree Menu code
*   has to be printed
* @return void
*/
function printPHPTreeMenu($menu_name) {
	print $this->_phpTreeMenu[$menu_name];
}

} /* END OF CLASS */

?>
